package main

import (
	"fmt"
	"runtime"
	"sync"
)

func test1() {
	pool := &sync.Pool{
		//初始化并放入一个数据
		New: func() interface{} {
			fmt.Println("创建一个新对象")
			return "你好呀"
		},
	}

	fmt.Println(pool.Get()) //获取初始化对象池放入的数据,输出: 你好呀
	pool.Put("我很好~")        //放入一个新的数据
	runtime.GC()            //人为的触发垃圾回收,清除sync.pool中缓存的对象
	fmt.Println(pool.Get()) //再次获取池中的数据,输出: 我很好~
}

func test2() {
	pool := &sync.Pool{
		New: func() interface{} {
			fmt.Println("创建一个新对象")
			return "hello"
		},
	}

	pool.Put("golang")
	pool.Put("php")
	pool.Put("java")

	var wg sync.WaitGroup
	for i := 0; i < 6; i++ {
		wg.Add(1)
		go func(id int) {
			fmt.Println(pool.Get())
			wg.Done()
		}(i)
	}
	wg.Wait()
}

func main() {
	//test1()
	test2()
}
